<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    class Father {
        constructor() {
        }

        sing() {
            console.log('father\'s sing')
        }
    }

    class Son extends Father { // ES 中使用extends继承父类
    }

    var son = new Son();
    son.sing(); // 调用父类的方法

    class Car {
        constructor(x, y) {
            console.log("Car's constructor");
            this.x = x;
            this.y = y;
        }

        sum() {
            console.log("Car sum.......");
            console.log(this);
            console.log(this.x + this.y); //这里的this在子类中必须使用super执行父类的构造函数才阔以被赋值
        }
    }

    class Bus {
        constructor(a,b) {
            console.log("Bus's constructor");
        }
    }

    class BMW extends Car{
        /**
         * 1.子类继承父类时，重写构造方法，必须含有super关键字,并且super必须放在this的前面
         * 2.使用super关键字在构造函数中访问父类的实例和方法
         * @param x
         * @param y
         */
        constructor(x, y) {
            console.log();
            super(x, y);

        }

        sum() {
            console.log("BMW sum.......");
            console.log(this);
            console.log(this.x + this.y + 1);
        }

        add(){
            this.sum();
            super.sum();
        }
    }

    // JS中这里的变量名不能和类重名
    var bmw = new BMW(1, 2);
    // bmw.sum(); //3
    bmw.add();

</script>
</body>
</html>